"""
全局配置模块

这个模块提供了全局配置的管理功能。
使用类方法实现全局状态的存取。
支持配置文件的读写操作。
"""
from typing import Optional, Dict, Any
import os
import configparser
import logging

logger = logging.getLogger(__name__)

class GlobalConfig:
    """
    全局配置类
    
    使用类变量和类方法管理全局配置。
    管理工作目录路径和配置文件。
    
    属性:
        _work_dir: 当前工作目录的路径
        _config: 配置解析器实例
        _cli: CLI实例
    """
    _work_dir: Optional[str] = None
    _config: Optional[configparser.ConfigParser] = None
    _cli: Optional[Any] = None  # CLI实例
    _result: Optional[Any] = None  # 命令执行结果
    _web_running: bool = False
    _current_config_path: str = 'config.ini'

    @classmethod
    def get_current_config_path(cls) -> str:
        return cls._current_config_path
    
    @classmethod
    def set_current_config_path(cls, _current_config_path: str) -> None:
        cls._current_config_path = _current_config_path

    @classmethod
    def get_web_running(cls) -> bool:
        return cls._web_running
    
    @classmethod
    def set_web_running(cls, _web_running: bool) -> None:
        cls._web_running = _web_running

    @classmethod
    def get_cli(cls) -> Any:
        """获取CLI实例"""
        if not cls._cli:
            raise ValueError("CLI未初始化")
        return cls._cli
    
    @classmethod
    def set_cli(cls, cli: Any) -> None:
        """设置CLI实例"""
        cls._cli = cli

    @classmethod
    def get_result(cls) -> Any:
        return cls._result
    
    @classmethod
    def set_result(cls, result: Any) -> None:
        cls._result = result


    @classmethod
    def get_work_dir(cls) -> Optional[str]:
        """获取当前工作目录路径"""
        return cls._work_dir or cls.get_config('work_dir')
    
    @classmethod
    def set_work_dir(cls, work_dir: str) -> None:
        """设置当前工作目录路径并初始化配置"""
        cls._work_dir = work_dir
        cls._init_config()
    
    @classmethod
    def _init_config(cls) -> None:
        """初始化配置解析器"""
        if not cls._work_dir:
            raise ValueError("工作目录未设置")
            
        cls._config = configparser.ConfigParser()
        config_path = cls._get_config_path()
        
        if os.path.exists(config_path):
            try:
                cls._config.read(config_path, encoding='utf-8')
            except Exception as e:
                logger.error(f"读取配置文件失败: {str(e)}")
                raise
        
        # 确保默认分区存在
        if 'DEFAULT' not in cls._config:
            cls._config['DEFAULT'] = {}
    
    @classmethod
    def _get_config_path(cls) -> str:
        """获取配置文件路径"""
        if not cls._work_dir:
            raise ValueError("工作目录未设置")
        return 'config.ini'
    
    @classmethod
    def set_config(cls, key: str, value: str) -> None:
        """
        设置配置项
        
        Args:
            key: 配置项键名
            value: 配置项值
        """
        if not cls._config:
            raise ValueError("配置未初始化")
            
        cls._config['DEFAULT'][key] = value
        
        try:
            with open(cls._get_config_path(), 'w', encoding='utf-8') as f:
                cls._config.write(f)
        except Exception as e:
            logger.error(f"写入配置文件失败: {str(e)}")
            raise
    
    @classmethod
    def get_config(cls, key: str) -> Optional[str]:
        """
        获取配置项值
        
        Args:
            key: 配置项键名
            
        Returns:
            配置项的值，如果不存在则返回None
        """
        if not cls._config:
            raise ValueError("配置未初始化")
        
        return cls._config['DEFAULT'].get(key)
    
    @classmethod
    def get_all_config(cls) -> Dict[str, str]:
        """
        获取所有配置项
        
        Returns:
            包含所有配置项的字典
        """
        if not cls._config:
            raise ValueError("配置未初始化")
            
        return dict(cls._config['DEFAULT'])


    @classmethod
    def init(cls, _current_config_path: str) -> None:    
        if os.path.exists(_current_config_path):
            cls._config = configparser.ConfigParser()
            try:
                cls._config.read(_current_config_path, encoding='utf-8')
                cls.set_current_config_path(_current_config_path)
            except Exception as e:
                logger.error(f"读取配置文件失败: {str(e)}")
                raise
        
        # 确保默认分区存在
        if 'DEFAULT' not in cls._config:
            cls._config['DEFAULT'] = {}
        